﻿// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动！任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任！

namespace Sinc.ERP.Core.Extensions;
public static class StringExtension
{
    /// <summary>
    /// 把字符串转成枚举
    /// </summary>
    /// <typeparam name="T">枚举类型</typeparam>
    /// <param name="enumName">是否忽略大小写</param>
    /// <param name="ignoreCase"></param>
    /// <param name="defaultValue"></param>
    /// <returns></returns>
    public static T ToEnum<T>(this string enumName, bool ignoreCase = true, T defaultValue = default) where T : struct
    {
        if (!System.Enum.TryParse(enumName, ignoreCase, out T result))
            result = defaultValue;
        return result;
    }

    /// <summary>
    /// 把字符串转成decimal，但不依赖任何动态区域。
    /// </summary>
    /// <param name="value"></param>
    /// <param name="defaultValue"></param>
    /// <returns></returns>
    public static decimal ToDecimal(this string value, decimal defaultValue = 0m)
    {
        if (decimal.TryParse(value, out var _value))
            return _value;

        return defaultValue;
    }

    /// <summary>
    /// 字符串转成INT类型
    /// </summary>
    /// <param name="value"></param>
    /// <param name="defaultValue"></param>
    /// <returns></returns>
    public static int ToInt32(this string value, int defaultValue = 0)
    {
        if (int.TryParse(value, out var _value))
            return _value;

        return defaultValue;
    }

    /// <summary>
    /// 是否是空值或者空白字符串
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public static bool IsEmpty(this string value)
    {
        return string.IsNullOrWhiteSpace(value);
    }

    /// <summary>
    /// 是否不是空值或者空白字符串，IsEmpty取反
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public static bool IsNotEmpty(this string value)
    {
        return !IsEmpty(value);
    }

    /// <summary>
    /// 倒序排列
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static string ToReverse(this string str)
    {
        char[] charArray = str.ToCharArray();
        Array.Reverse(charArray);
        return new string(charArray);
    }

    /// <summary>
    /// 修剪头部指定字符串
    /// </summary>
    /// <param name="str"></param>
    /// <param name="trimString"></param>
    /// <returns></returns>
    public static string TrimStartString(this string str, string trimString)
    {
        if (str.IsEmpty())
            return string.Empty;

        if (!str.StartsWith(trimString) || trimString.IsEmpty())
            return str;

        return str.Substring(trimString.Length);
    }

    /// <summary>
    /// 修剪尾部指定字符串
    /// </summary>
    /// <param name="str"></param>
    /// <param name="trimString"></param>
    /// <returns></returns>
    public static string TrimEndString(this string str, string trimString)
    {
        if (str.IsEmpty())
            return string.Empty;

        if (!str.EndsWith(trimString) || trimString.IsEmpty())
            return str;

        return str.Substring(0, str.Length - trimString.Length);
    }

    /// <summary>
    /// 修剪前后指定字符串
    /// </summary>
    /// <param name="str"></param>
    /// <param name="trimString"></param>
    /// <returns></returns>
    public static string TrimString(this string str, string trimString)
    {
        return str.TrimStartString(trimString).TrimEndString(trimString);
    }

    /// <summary>
    /// 安全裁剪字符串
    /// </summary>
    /// <param name="str"></param>
    /// <param name="startIndex"></param>
    /// <param name="length"></param>
    /// <returns></returns>
    public static string SafeSubstring(this string str, int startIndex = 0, int length = 0)
    {
        if (str.IsEmpty())
            return str;

        if (str.Length < startIndex + 1)
            return string.Empty;

        if (str.Length < length || str.Length < length + startIndex)
            return str.Substring(startIndex);

        if (length != 0)
            return str.Substring(startIndex, length);

        return str.Substring(startIndex);
    }
}
